﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Twodi.Aspect.Interfaces;
using Microsoft.Xna.Framework;
using Twodi.Interfaces;

namespace Twodi.Aspect.Implemented
{
    /// <summary>
    /// Define um componente com rotação. Lembrando que no XNA o ponto de origem altera a posição do componente caso seja usado no metodo de Draw().
    /// </summary>
    public class RotationAspect : AbstractAspect, IRotation
    {
        /// <summary>
        /// Angulo da rotação.
        /// </summary>
        private float angle;

        /// <summary>
        /// Ponto usado como origem de rotação.
        /// </summary>
        private Vector2 origin;

        /// <summary>
        /// Angulo da rotação.
        /// </summary>
        public float Angle
        {
            get
            {
                return this.angle;
            }
            set
            {
                OnPropertyChanged<float>("Angle", out angle, value);
            }
        }

        /// <summary>
        /// Ponto usado como origem de rotação.
        /// </summary>
        public Vector2 Origin
        {
            get
            {
                return this.origin;
            }
            set
            {
                OnPropertyChanged<Vector2>("Origin", out origin, value);
            }
        }

        /// <summary>
        /// Evento invocado quando angulo de rotação é alterado.
        /// </summary>
        public event EventHandler AngleChanged;

        /// <summary>
        /// Evento invocado quando ponto de origem de rotação é alterado.
        /// </summary>
        public event EventHandler OriginChanged;

        /// <summary>
        /// Método invocado no momento que o angulo é alterado.
        /// </summary>
        /// <param name="e"></param>
        protected virtual void onAngleChanged(EventArgs e)
        {
            if (AngleChanged != null) AngleChanged(this, e);
        }

        /// <summary>
        /// Método invocado no momento que o ponto de origem de rotação é alterado.
        /// </summary>
        /// <param name="e"></param>
        protected virtual void onOriginChanged(EventArgs e)
        {
            if (OriginChanged != null) OriginChanged(this, e);
        }
    }
}
